package com.share.auth.service;

import com.share.common.core.constant.Constants;
import com.share.common.core.domain.R;
import com.share.common.core.exception.ServiceException;
import com.share.common.core.utils.StringUtils;
import com.share.common.core.utils.ip.IpUtils;
import com.share.system.api.model.LoginUser;
import com.share.user.api.RemoteUserInfoService;
import com.share.user.api.domain.UserInfo;
import com.share.user.api.modei.UpdateUserLogin;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Date;

@Slf4j
@Component
@RequiredArgsConstructor
public class H5LoginService {

    private final RemoteUserInfoService remoteUserInfoService;

    private final SysRecordLogService recordLogService;

    /**
     * 微信登录处理方法
     *
     * @param code 微信授权码，用于获取用户信息
     * @return 登录成功后的用户信息
     * @throws ServiceException 当登录过程中出现异常情况时抛出
     */
    public LoginUser login(String code) {
        // 1. 校验微信授权码是否为空
        if (StringUtils.isAnyBlank(code)) {
            throw new ServiceException("微信code必须填写");
        }

        // 2. 调用远程服务获取微信用户信息
        R<UserInfo> userResult = remoteUserInfoService.wxLogin(code);

        // 3. 校验服务返回结果
        if (userResult == null || userResult.getData() == null) {
            throw new ServiceException("微信授权登录失败");
        }

        if (R.FAIL == userResult.getCode()) {
            // 记录内部错误日志，但向用户隐藏具体错误信息
            log.error("微信登录接口调用失败: {}", userResult.getMsg());
            throw new ServiceException("登录验证失败");
        }

        // 4. 获取用户信息并校验关键属性
        UserInfo userInfo = userResult.getData();
        if (userInfo.getId() == null || StringUtils.isBlank(userInfo.getWxOpenId()) || StringUtils.isBlank(userInfo.getStatus())) {
            throw new ServiceException("用户信息不完整");
        }

        // 5. 校验用户状态
        String status = userInfo.getStatus();
        if ("0".equals(status)) {
            // 使用用户ID记录日志，避免暴露敏感信息
            recordLogService.recordLogininfor("用户ID:" + userInfo.getId(), Constants.LOGIN_FAIL, "用户已停用，请联系管理员");
            throw new ServiceException("对不起，您的账号已停用");
        }

        // 可扩展其他状态码的处理逻辑
        if (!"1".equals(status)) {
            recordLogService.recordLogininfor("用户ID:" + userInfo.getId(), Constants.LOGIN_FAIL, "未知用户状态: " + status);
            throw new ServiceException("账号状态异常，请联系管理员");
        }

        // 6. 构建登录用户对象
        LoginUser loginUser = new LoginUser();
        loginUser.setUserid(userInfo.getId());
        loginUser.setUsername(userInfo.getWxOpenId());
        loginUser.setStatus(userInfo.getStatus());

        // 7. 记录登录成功日志
        recordLogService.recordLogininfor(userInfo.getWxOpenId(), Constants.LOGIN_SUCCESS, "登录成功");

        // 8. 更新用户登录信息（失败不影响登录流程）
        try {
            UpdateUserLogin updateUserLogin = new UpdateUserLogin();
            updateUserLogin.setUserId(userInfo.getId());
            updateUserLogin.setLastLoginIp(IpUtils.getIpAddr());
            updateUserLogin.setLastLoginTime(new Date());
            remoteUserInfoService.updateUserLogin(updateUserLogin);
        } catch (Exception e) {
            // 记录更新失败日志，但不影响登录结果
            log.error("更新用户登录信息失败，用户ID: {}", userInfo.getId(), e);
        }

        return loginUser;
    }
}
